package com.Jano.service.Impl;

import com.Jano.dao.CategoryDao;
import com.Jano.dao.Impl.CategoryDaoImpl;
import com.Jano.dto.CategoryDto;
import com.Jano.entity.Category;
import com.Jano.service.CategoryService;
import com.alibaba.fastjson.JSON;
import org.junit.Test;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;

import java.util.ArrayList;
import java.util.List;
import java.util.Objects;

import static com.Jano.constant.BusinessConstant.*;

/**
 * description: CategoryServiceImpl <br>
 * date: 2022/6/10 11:46 PM <br>
 * author: zoumaoji <br>
 * version: 1.0 <br>
 */
public class CategoryServiceImpl extends AbstractBaseServiceImpl implements CategoryService {
    private CategoryDao categoryDao = new CategoryDaoImpl();

    @Override
    public List<CategoryDto> getAllCategories() {
        List<Category> allCategories = categoryDao.selectAllCategories();
        // 所有目录的集合
        List<CategoryDto> allNodes = new ArrayList<>();
        // 一级目录的集合
        List<CategoryDto> baseNodes = new ArrayList<>();
        //最终结果
        List<CategoryDto> result = new ArrayList<>();
        //得到一级目录 和 所有目录
        for (Category category : allCategories) {
            CategoryDto categoryDto = new CategoryDto();
            categoryDto.setId(category.getId());
            categoryDto.setTitle(category.getName());
            categoryDto.setParentId(category.getParentId());
            if (category.getParentId() == 0) {
                baseNodes.add(categoryDto);
            }
            allNodes.add(categoryDto);
        }
        //从一级目录开始遍历，通过递归找到下级目录，将带有下级目录的结果放入返回结果中
        for (CategoryDto baseNode : baseNodes) {
            baseNode = buildCategoryTree(allNodes, baseNode);
            result.add(baseNode);
        }
        return result;
    }

    /**
     * 功能：根据传入的目录，获取该目录的子目录集合，将集合赋值给该目录的children属性，返回该目录
     *
     * @param allNodes
     * @param baseNode
     * @return
     */

    public CategoryDto buildCategoryTree(List<CategoryDto> allNodes, CategoryDto baseNode) {
        List<CategoryDto> children = new ArrayList<>();
        //遍历查到的所有目录
        for (CategoryDto categoryDto : allNodes) {
            // 0代表根目录，不需要重复的比较
            if (categoryDto.getParentId() == 0) {
                continue;
            }
            // 当前目录的parentId和传入的根目录Id相等，表示是此根目录的子节点
            if (categoryDto.getParentId() == baseNode.getId()) {
                //递归调用，再去寻找其下的子节点
                categoryDto = buildCategoryTree(allNodes, categoryDto);
                //当前目录是该目录的一个下级目录，放入children集合内
                children.add(categoryDto);
            }
        }
        // 得到的最终结果 给该目录的children 赋值
        baseNode.setChildren(children);
        return baseNode;
    }

    @Override
    public void saveAllCategoriesInRedis() {
        try (JedisPool jedisPool = new JedisPool(REDIS_HOST, REDIS_POST);
             Jedis jedis = jedisPool.getResource()) {
            List<CategoryDto> allCategories = getAllCategories();
            String jsonCategories = JSON.toJSONString(allCategories);
            jedis.setnx(REDIS_PRODUCT_CATALOGUE_KEY,jsonCategories);
        }
    }

    @Override
    public List<CategoryDto> getCategoriesByRedis() {
        try (JedisPool jedisPool = new JedisPool(REDIS_HOST, REDIS_POST);
             Jedis jedis = jedisPool.getResource()) {
            String jsonCategories = jedis.get(REDIS_PRODUCT_CATALOGUE_KEY);
            List<CategoryDto> categoryDto = JSON.parseArray(jsonCategories,CategoryDto.class);
            return categoryDto;
        }
    }


}
